﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Entity;


namespace WPFServices.Services
{
    public static class OrderDetails
    {
        public static void CreateOrderDetail(ORDER_DETAILS newOrderDetail)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    db.ORDER_DETAILS.Add(newOrderDetail);
                    db.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw new Exception("Không thể thêm OrderDetail");
            }
        }

        public static IList<ORDER_DETAILS> GetListByOrderID(int orderID)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    var list = db.ORDER_DETAILS.Where(od => od.ID_ORD == orderID).Include(x => x.PRODUCT).Include(x => x.ORDER).Include(x=>x.PRODUCT.CATALOG).Include(x=>x.PRODUCT.DETAILS_PRODUCTS).Include(x=>x.PRODUCT.DETAILS_PRODUCTS.UNIT).ToList();
                    return list;
                }
            }
            catch (Exception)
            {
                throw new Exception("Không thể lấy danh sách OrderDetails");
            }

        }
        /// <summary>
        /// Hàm cập nhật thông tin của hóa đơn xuất
        ///  - Nếu không có sản phẩm trong hóa đơn => thêm vào hóa đơn sản phẩm với số lượng đó
        ///  - Cập nhật lại số lượng trong kho: tăng giảm tùy theo số lượng chênh lệch so với hóa đơn cũ
        /// </summary>
        /// <param name="list">Danh sách sản phẩm</param>
        /// <param name="isExportType">Biến xác định là loại hóa đơn nào: true => xuất, false => nhập</param>
        /// <param name="isMarcle">Biến xác định là loại đá hoa cương</param>
        public static void UpdateOrderDetail(List<ORDER_DETAILS>  list, bool isExportType, bool isMarcle)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    foreach (ORDER_DETAILS ord in list)
                    {
                        if (!(ord.ID_PRO_AUTO > 0))
                            continue;
                        var ord1 = ord;
                        var orderDetail = db.ORDER_DETAILS.Where(od => od.ID_ORD == ord1.ID_ORD && od.ID_PRO_AUTO == ord1.ID_PRO_AUTO).Include(x=>x.PRODUCT).FirstOrDefault();
                        if (orderDetail == null)
                        {
                            CreateOrderDetail(ord);
                            if(isExportType)
                            {
                                if (ord.QUANTITY != null)
                                    if(isMarcle)
                                        Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, -ord.QUANTITY.Value, -ord.WIDTH.Value, -ord.HEIGHT.Value, -(ord.HEIGHT.Value * ord.WIDTH.Value));
                                    else
                                        Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, -ord.QUANTITY.Value);
                            }
                            else if (ord.QUANTITY != null)
                                Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, ord.QUANTITY.Value);
                        }
                        else
                        {
                            if (orderDetail.QUANTITY != null)
                            {


                                if (isExportType)
                                {
                                    orderDetail.ACTIVEPRICE = ord.ACTIVEPRICE.Value;
                                    db.SaveChanges();// nếu dòng lệnh tiếp theo mà chạy contineu thì sẽ k cập nhật được
                                }

                                int quatityBeforeUpdate = orderDetail.QUANTITY??0;
                                double HeightBeforeUpdate = orderDetail.HEIGHT ?? 0;
                                double WidthBeforeUpdate = orderDetail.WIDTH ?? 0;
                                double M2BeforeUpdate = orderDetail.M2 ?? 0;

                                if (ord.QUANTITY != null && quatityBeforeUpdate == ord.QUANTITY.Value && HeightBeforeUpdate == ord.HEIGHT && WidthBeforeUpdate == ord.WIDTH && M2BeforeUpdate == ord.M2)
                                    continue; // so luong khong thay doi => khong cap nhat
                                orderDetail.QUANTITY = ord.QUANTITY;
                                orderDetail.HEIGHT = ord.HEIGHT;
                                orderDetail.WIDTH = ord.WIDTH;
                                orderDetail.M2 = ord.M2;
                                db.SaveChanges();
                                // xử lý cập nhật lại số lượng trong kho
                                if (isExportType)
                                {
                                    if (ord.QUANTITY != null)
                                    {
                                        if (isMarcle)
                                            Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, quatityBeforeUpdate - ord.QUANTITY.Value, WidthBeforeUpdate - ord.WIDTH.Value, HeightBeforeUpdate - ord.HEIGHT.Value, M2BeforeUpdate - ord.M2.Value);
                                        else
                                            Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, quatityBeforeUpdate - ord.QUANTITY.Value);
                                    }
                                }
                                else
                                {
                                    if (ord.QUANTITY != null)
                                    {
                                        if (isMarcle)
                                            Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, ord.QUANTITY.Value - quatityBeforeUpdate, -WidthBeforeUpdate + ord.WIDTH.Value, -HeightBeforeUpdate + ord.HEIGHT.Value, -M2BeforeUpdate + ord.M2.Value);
                                        else
                                            Products.UpdateInvetoryCountByProductAutoID(ord.ID_PRO_AUTO, ord.QUANTITY.Value - quatityBeforeUpdate);
                                    }
                                }
                            }
                            db.SaveChanges();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception("Không thể cập nhật danh sách OrderDetails"+e.Message);
            }
        }
    }
}
